代码审计和命令注入
代码
1 |
|
三个地方的绕过
1 | $num = '1e5'; |
1e5为100000的科学计数法,将1e5 作为参数放入intval函数内执行会返回结果 1
, 将1e5 加上 1后,其结果为100001,在将100001放入intval,结果自然为100001,成功绕过。
1 | $md5=$_GET['md5']; |
这里的绕过其实有两种方式,我在网上看到的教程大部分都是用 0e215962017
字符串绕过,这串字符经过md5加密后,会得到前两位是 0e
开头的字符串,在经过 ==
的比较,就会返回为真。
还有一个方式就是空数组,这个方法在直接在代码里赋值是成立的,但是通过GET传参 md5[]=
,就不能显示,具体原因无从得知,md5对数组加密后会返回Flase
,再与空数组进行比较,会相等。
1 | $get_flag = $_GET['get_flag']; |
不能有空格,cat会被替换成wctf2020,空格代替方式有很多 ${IFS}
${IFS}$9
<
都可用代替空格,cat的代替方式也很多, more
tac
cat
less
head
tail
,如果是被替换,还可用通过混淆来绕过,比如,cat
被过滤,通过c"at
来绕过。
最终payload
1 | fl4g.php?num=1e5&md5=0e215962017&get_flag=c""at<fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag |